{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# E-Divisive Analysis\n",
    "This notebook aims to test out the different E-Divisive implementations we could be using in the Dashboard, starting with the one we already have and potentially using a combination of third-party libraries. The intent of the notebook is both to compare and contrast the different approaches, pros/cons of using each of these options.\n",
    "\n",
    "NOTE: This requires that pandas, numpy, scipy, statsmodels, numba, and matplotlib are installed to execute. We are also using Python 3.7 to gain access to the latest versions of these libraries. To install these in your system, this should be sufficient:\n",
    "\n",
    "```\n",
    "pip3 install --user numpy scipy pandas statsmodels \\\n",
    "    numba matplotlib\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "_CATAPULT_PATH=os.path.join(os.path.abspath(''), '..', '..', '..')\n",
    "_DASHBOARD_PATH=os.path.join(_CATAPULT_PATH, 'dashboard')\n",
    "\n",
    "# Set up the environment so that we can import the modules in the\n",
    "# Dashboard codebase.\n",
    "sys.path.insert(0, _CATAPULT_PATH)\n",
    "sys.path.insert(0, _DASHBOARD_PATH)\n",
    "\n",
    "import dashboard\n",
    "# Include all the paths needed for testing\n",
    "for path in dashboard.PathsForTesting():\n",
    "    sys.path.insert(0, path)\n",
    "\n",
    "from dashboard.common import clustering_change_detector as ccd\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import statsmodels as sm\n",
    "import numba as nb\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From this point on we can use `ccd` to refer to our clustering change detector implementation in the Dashboard. Here we can use all sorts of utilities that we can also analyse. The first one we'll use is the estimator implementation:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>measurement</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>1000</th>\n      <td>105.626737</td>\n    </tr>\n    <tr>\n      <th>1001</th>\n      <td>99.566519</td>\n    </tr>\n    <tr>\n      <th>1002</th>\n      <td>95.326771</td>\n    </tr>\n    <tr>\n      <th>1003</th>\n      <td>103.067464</td>\n    </tr>\n    <tr>\n      <th>1004</th>\n      <td>100.389694</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>1145</th>\n      <td>105.881368</td>\n    </tr>\n    <tr>\n      <th>1146</th>\n      <td>103.028150</td>\n    </tr>\n    <tr>\n      <th>1147</th>\n      <td>100.868952</td>\n    </tr>\n    <tr>\n      <th>1148</th>\n      <td>96.767180</td>\n    </tr>\n    <tr>\n      <th>1149</th>\n      <td>98.845149</td>\n    </tr>\n  </tbody>\n</table>\n<p>150 rows × 1 columns</p>\n</div>",
      "text/plain": "      measurement\n1000   105.626737\n1001    99.566519\n1002    95.326771\n1003   103.067464\n1004   100.389694\n...           ...\n1145   105.881368\n1146   103.028150\n1147   100.868952\n1148    96.767180\n1149    98.845149\n\n[150 rows x 1 columns]"
     },
     "metadata": {},
     "execution_count": 2
    }
   ],
   "source": [
    "# Create a random dataset from some normal distributions.\n",
    "measurements = np.concatenate(\n",
    "        (np.random.normal(100, 5, 50),\n",
    "        np.random.normal(20, 5, 50),\n",
    "        np.random.normal(100, 5, 50)),\n",
    "        axis=None)\n",
    "commits = np.arange(1000,1150,dtype=np.int64)\n",
    "frame = pd.DataFrame(measurements, columns=['measurement'], index=commits)\n",
    "frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "848 ms ± 6.22 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
    }
   ],
   "source": [
    "# We then create a column of estimates. First, we'll do it with\n",
    "# the pure Python implementation, and time it.\n",
    "def create_estimates(measurements):\n",
    "    results = np.array(\n",
    "        [ccd.Estimator(measurements, i) for i in\n",
    "         range(len(measurements))])\n",
    "    return results\n",
    "\n",
    "estimates=create_estimates(measurements)\n",
    "frame['estimates'] = estimates\n",
    "frame['probability'] = estimates / np.nanmax(estimates)\n",
    "%timeit create_estimates(measurements)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's now visualize the data, showing the probabilities along the range of values we've encountered. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "<matplotlib.axes._subplots.AxesSubplot at 0x7f12aa3bab10>"
     },
     "metadata": {},
     "execution_count": 4
    },
    {
     "output_type": "display_data",
     "data": {
      "image/png": "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\n",
      "text/plain": "<Figure size 432x288 with 2 Axes>",
      "image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"263.63625pt\" version=\"1.1\" viewBox=\"0 0 375.2875 263.63625\" width=\"375.2875pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <defs>\n  <style type=\"text/css\">\n*{stroke-linecap:butt;stroke-linejoin:round;}\n  </style>\n </defs>\n <g id=\"figure_1\">\n  <g id=\"patch_1\">\n   <path d=\"M 0 263.63625 \nL 375.2875 263.63625 \nL 375.2875 0 \nL 0 0 \nz\n\" style=\"fill:none;\"/>\n  </g>\n  <g id=\"axes_1\">\n   <g id=\"patch_2\">\n    <path d=\"M 33.2875 121.154489 \nL 368.0875 121.154489 \nL 368.0875 22.318125 \nL 33.2875 22.318125 \nz\n\" style=\"fill:#ffffff;\"/>\n   </g>\n   <g id=\"matplotlib.axis_1\">\n    <g id=\"xtick_1\">\n     <g id=\"line2d_1\">\n      <defs>\n       <path d=\"M 0 0 \nL 0 3.5 \n\" id=\"m28dd5e3274\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n      </defs>\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"48.505682\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_2\">\n     <g id=\"line2d_2\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"89.359861\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_3\">\n     <g id=\"line2d_3\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"130.214041\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_4\">\n     <g id=\"line2d_4\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"171.06822\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_5\">\n     <g id=\"line2d_5\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"211.922399\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_6\">\n     <g id=\"line2d_6\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"252.776579\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_7\">\n     <g id=\"line2d_7\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"293.630758\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_8\">\n     <g id=\"line2d_8\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"334.484937\" xlink:href=\"#m28dd5e3274\" y=\"121.154489\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"matplotlib.axis_2\">\n    <g id=\"ytick_1\">\n     <g id=\"line2d_9\">\n      <defs>\n       <path d=\"M 0 0 \nL -3.5 0 \n\" id=\"mcc8a6dee28\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n      </defs>\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"33.2875\" xlink:href=\"#mcc8a6dee28\" y=\"81.083572\"/>\n      </g>\n     </g>\n     <g id=\"text_1\">\n      <!-- 50 -->\n      <defs>\n       <path d=\"M 10.796875 72.90625 \nL 49.515625 72.90625 \nL 49.515625 64.59375 \nL 19.828125 64.59375 \nL 19.828125 46.734375 \nQ 21.96875 47.46875 24.109375 47.828125 \nQ 26.265625 48.1875 28.421875 48.1875 \nQ 40.625 48.1875 47.75 41.5 \nQ 54.890625 34.8125 54.890625 23.390625 \nQ 54.890625 11.625 47.5625 5.09375 \nQ 40.234375 -1.421875 26.90625 -1.421875 \nQ 22.3125 -1.421875 17.546875 -0.640625 \nQ 12.796875 0.140625 7.71875 1.703125 \nL 7.71875 11.625 \nQ 12.109375 9.234375 16.796875 8.0625 \nQ 21.484375 6.890625 26.703125 6.890625 \nQ 35.15625 6.890625 40.078125 11.328125 \nQ 45.015625 15.765625 45.015625 23.390625 \nQ 45.015625 31 40.078125 35.4375 \nQ 35.15625 39.890625 26.703125 39.890625 \nQ 22.75 39.890625 18.8125 39.015625 \nQ 14.890625 38.140625 10.796875 36.28125 \nz\n\" id=\"DejaVuSans-53\"/>\n       <path d=\"M 31.78125 66.40625 \nQ 24.171875 66.40625 20.328125 58.90625 \nQ 16.5 51.421875 16.5 36.375 \nQ 16.5 21.390625 20.328125 13.890625 \nQ 24.171875 6.390625 31.78125 6.390625 \nQ 39.453125 6.390625 43.28125 13.890625 \nQ 47.125 21.390625 47.125 36.375 \nQ 47.125 51.421875 43.28125 58.90625 \nQ 39.453125 66.40625 31.78125 66.40625 \nz\nM 31.78125 74.21875 \nQ 44.046875 74.21875 50.515625 64.515625 \nQ 56.984375 54.828125 56.984375 36.375 \nQ 56.984375 17.96875 50.515625 8.265625 \nQ 44.046875 -1.421875 31.78125 -1.421875 \nQ 19.53125 -1.421875 13.0625 8.265625 \nQ 6.59375 17.96875 6.59375 36.375 \nQ 6.59375 54.828125 13.0625 64.515625 \nQ 19.53125 74.21875 31.78125 74.21875 \nz\n\" id=\"DejaVuSans-48\"/>\n      </defs>\n      <g transform=\"translate(13.5625 84.88279)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-53\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_2\">\n     <g id=\"line2d_10\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"33.2875\" xlink:href=\"#mcc8a6dee28\" y=\"36.202347\"/>\n      </g>\n     </g>\n     <g id=\"text_2\">\n      <!-- 100 -->\n      <defs>\n       <path d=\"M 12.40625 8.296875 \nL 28.515625 8.296875 \nL 28.515625 63.921875 \nL 10.984375 60.40625 \nL 10.984375 69.390625 \nL 28.421875 72.90625 \nL 38.28125 72.90625 \nL 38.28125 8.296875 \nL 54.390625 8.296875 \nL 54.390625 0 \nL 12.40625 0 \nz\n\" id=\"DejaVuSans-49\"/>\n      </defs>\n      <g transform=\"translate(7.2 40.001566)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"line2d_11\">\n    <path clip-path=\"url(#p6040823aec)\" d=\"M 48.505682 31.151651 \nL 50.548391 36.591451 \nL 52.5911 40.397152 \nL 54.633809 33.448916 \nL 56.676518 35.852548 \nL 58.719227 32.882513 \nL 60.761936 39.628955 \nL 62.804645 33.287468 \nL 64.847354 31.550722 \nL 66.890063 43.846964 \nL 68.932772 36.558969 \nL 70.97548 42.266243 \nL 73.018189 35.138542 \nL 75.060898 41.83176 \nL 77.103607 47.615321 \nL 79.146316 33.481409 \nL 81.189025 34.700871 \nL 83.231734 46.801269 \nL 85.274443 37.711864 \nL 87.317152 37.304684 \nL 89.359861 28.677362 \nL 91.40257 32.972649 \nL 93.445279 36.981308 \nL 95.487988 38.072645 \nL 97.530697 34.312275 \nL 99.573406 40.700677 \nL 101.616115 38.368716 \nL 103.658824 38.778796 \nL 105.701533 30.616491 \nL 107.744242 33.40998 \nL 109.786951 35.363834 \nL 111.82966 39.418232 \nL 113.872369 37.535548 \nL 115.915078 37.226733 \nL 117.957787 30.005533 \nL 120.000496 30.780947 \nL 122.043205 34.746958 \nL 126.128623 31.398535 \nL 128.171332 40.715366 \nL 130.214041 28.165075 \nL 132.25675 31.470593 \nL 134.299459 28.263735 \nL 136.342167 27.616784 \nL 140.427585 29.622807 \nL 142.470294 41.576515 \nL 144.513003 42.008176 \nL 146.555712 41.845733 \nL 148.598421 46.743017 \nL 150.64113 107.841563 \nL 152.683839 104.638119 \nL 154.726548 107.116816 \nL 156.769257 116.431672 \nL 158.811966 106.426682 \nL 160.854675 108.491794 \nL 162.897384 108.052382 \nL 164.940093 106.470085 \nL 166.982802 109.282953 \nL 169.025511 111.765612 \nL 171.06822 106.456601 \nL 173.110929 113.492196 \nL 175.153638 110.393396 \nL 177.196347 109.100302 \nL 179.239056 115.162065 \nL 181.281765 107.223001 \nL 183.324474 106.611165 \nL 185.367183 112.804726 \nL 187.409892 110.984124 \nL 189.452601 103.159859 \nL 191.49531 99.998836 \nL 193.538019 115.96548 \nL 195.580728 107.350971 \nL 197.623437 112.107664 \nL 199.666146 102.913728 \nL 201.708854 105.430592 \nL 203.751563 104.486341 \nL 205.794272 105.607486 \nL 207.836981 109.217182 \nL 209.87969 111.861772 \nL 211.922399 104.305396 \nL 213.965108 116.661927 \nL 216.007817 112.393638 \nL 218.050526 109.37742 \nL 220.093235 107.105194 \nL 222.135944 108.543223 \nL 224.178653 108.387275 \nL 226.221362 105.888381 \nL 232.349489 106.714702 \nL 234.392198 102.239865 \nL 236.434907 101.491704 \nL 238.477616 103.918465 \nL 240.520325 113.811903 \nL 242.563034 107.032398 \nL 244.605743 107.511923 \nL 246.648452 102.982755 \nL 248.691161 110.312907 \nL 250.73387 104.594096 \nL 252.776579 33.119183 \nL 254.819288 29.40253 \nL 256.861997 34.409756 \nL 258.904706 38.460844 \nL 260.947415 38.770785 \nL 262.990124 52.424034 \nL 265.032833 36.765735 \nL 267.075541 32.766983 \nL 269.11825 32.342023 \nL 271.160959 36.808902 \nL 273.203668 38.854655 \nL 275.246377 39.686607 \nL 277.289086 34.629566 \nL 279.331795 36.184459 \nL 281.374504 42.036188 \nL 283.417213 41.03933 \nL 285.459922 33.627104 \nL 287.502631 44.130672 \nL 291.588049 35.228131 \nL 293.630758 36.024169 \nL 295.673467 39.530441 \nL 297.716176 38.909823 \nL 299.758885 31.816781 \nL 301.801594 44.636252 \nL 303.844303 26.810687 \nL 305.887012 27.927124 \nL 307.929721 37.215572 \nL 309.97243 41.595541 \nL 312.015139 30.727078 \nL 314.057848 36.85563 \nL 316.100557 40.781463 \nL 318.143266 34.218435 \nL 320.185975 40.44167 \nL 322.228684 36.505873 \nL 324.271393 39.850101 \nL 326.314102 41.195879 \nL 328.356811 29.970757 \nL 330.39952 30.960651 \nL 332.442228 46.340512 \nL 334.484937 39.137254 \nL 336.527646 42.612069 \nL 340.613064 36.499348 \nL 342.655773 37.155511 \nL 344.698482 30.923087 \nL 346.741191 33.484206 \nL 348.7839 35.422354 \nL 350.826609 39.104206 \nL 352.869318 37.23897 \nL 352.869318 37.23897 \n\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n   </g>\n   <g id=\"patch_3\">\n    <path d=\"M 33.2875 121.154489 \nL 33.2875 22.318125 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"patch_4\">\n    <path d=\"M 368.0875 121.154489 \nL 368.0875 22.318125 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"patch_5\">\n    <path d=\"M 33.2875 121.154489 \nL 368.0875 121.154489 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"patch_6\">\n    <path d=\"M 33.2875 22.318125 \nL 368.0875 22.318125 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"text_3\">\n    <!-- Measurements -->\n    <defs>\n     <path d=\"M 9.8125 72.90625 \nL 24.515625 72.90625 \nL 43.109375 23.296875 \nL 61.8125 72.90625 \nL 76.515625 72.90625 \nL 76.515625 0 \nL 66.890625 0 \nL 66.890625 64.015625 \nL 48.09375 14.015625 \nL 38.1875 14.015625 \nL 19.390625 64.015625 \nL 19.390625 0 \nL 9.8125 0 \nz\n\" id=\"DejaVuSans-77\"/>\n     <path d=\"M 56.203125 29.59375 \nL 56.203125 25.203125 \nL 14.890625 25.203125 \nQ 15.484375 15.921875 20.484375 11.0625 \nQ 25.484375 6.203125 34.421875 6.203125 \nQ 39.59375 6.203125 44.453125 7.46875 \nQ 49.3125 8.734375 54.109375 11.28125 \nL 54.109375 2.78125 \nQ 49.265625 0.734375 44.1875 -0.34375 \nQ 39.109375 -1.421875 33.890625 -1.421875 \nQ 20.796875 -1.421875 13.15625 6.1875 \nQ 5.515625 13.8125 5.515625 26.8125 \nQ 5.515625 40.234375 12.765625 48.109375 \nQ 20.015625 56 32.328125 56 \nQ 43.359375 56 49.78125 48.890625 \nQ 56.203125 41.796875 56.203125 29.59375 \nz\nM 47.21875 32.234375 \nQ 47.125 39.59375 43.09375 43.984375 \nQ 39.0625 48.390625 32.421875 48.390625 \nQ 24.90625 48.390625 20.390625 44.140625 \nQ 15.875 39.890625 15.1875 32.171875 \nz\n\" id=\"DejaVuSans-101\"/>\n     <path d=\"M 34.28125 27.484375 \nQ 23.390625 27.484375 19.1875 25 \nQ 14.984375 22.515625 14.984375 16.5 \nQ 14.984375 11.71875 18.140625 8.90625 \nQ 21.296875 6.109375 26.703125 6.109375 \nQ 34.1875 6.109375 38.703125 11.40625 \nQ 43.21875 16.703125 43.21875 25.484375 \nL 43.21875 27.484375 \nz\nM 52.203125 31.203125 \nL 52.203125 0 \nL 43.21875 0 \nL 43.21875 8.296875 \nQ 40.140625 3.328125 35.546875 0.953125 \nQ 30.953125 -1.421875 24.3125 -1.421875 \nQ 15.921875 -1.421875 10.953125 3.296875 \nQ 6 8.015625 6 15.921875 \nQ 6 25.140625 12.171875 29.828125 \nQ 18.359375 34.515625 30.609375 34.515625 \nL 43.21875 34.515625 \nL 43.21875 35.40625 \nQ 43.21875 41.609375 39.140625 45 \nQ 35.0625 48.390625 27.6875 48.390625 \nQ 23 48.390625 18.546875 47.265625 \nQ 14.109375 46.140625 10.015625 43.890625 \nL 10.015625 52.203125 \nQ 14.9375 54.109375 19.578125 55.046875 \nQ 24.21875 56 28.609375 56 \nQ 40.484375 56 46.34375 49.84375 \nQ 52.203125 43.703125 52.203125 31.203125 \nz\n\" id=\"DejaVuSans-97\"/>\n     <path d=\"M 44.28125 53.078125 \nL 44.28125 44.578125 \nQ 40.484375 46.53125 36.375 47.5 \nQ 32.28125 48.484375 27.875 48.484375 \nQ 21.1875 48.484375 17.84375 46.4375 \nQ 14.5 44.390625 14.5 40.28125 \nQ 14.5 37.15625 16.890625 35.375 \nQ 19.28125 33.59375 26.515625 31.984375 \nL 29.59375 31.296875 \nQ 39.15625 29.25 43.1875 25.515625 \nQ 47.21875 21.78125 47.21875 15.09375 \nQ 47.21875 7.46875 41.1875 3.015625 \nQ 35.15625 -1.421875 24.609375 -1.421875 \nQ 20.21875 -1.421875 15.453125 -0.5625 \nQ 10.6875 0.296875 5.421875 2 \nL 5.421875 11.28125 \nQ 10.40625 8.6875 15.234375 7.390625 \nQ 20.0625 6.109375 24.8125 6.109375 \nQ 31.15625 6.109375 34.5625 8.28125 \nQ 37.984375 10.453125 37.984375 14.40625 \nQ 37.984375 18.0625 35.515625 20.015625 \nQ 33.0625 21.96875 24.703125 23.78125 \nL 21.578125 24.515625 \nQ 13.234375 26.265625 9.515625 29.90625 \nQ 5.8125 33.546875 5.8125 39.890625 \nQ 5.8125 47.609375 11.28125 51.796875 \nQ 16.75 56 26.8125 56 \nQ 31.78125 56 36.171875 55.265625 \nQ 40.578125 54.546875 44.28125 53.078125 \nz\n\" id=\"DejaVuSans-115\"/>\n     <path d=\"M 8.5 21.578125 \nL 8.5 54.6875 \nL 17.484375 54.6875 \nL 17.484375 21.921875 \nQ 17.484375 14.15625 20.5 10.265625 \nQ 23.53125 6.390625 29.59375 6.390625 \nQ 36.859375 6.390625 41.078125 11.03125 \nQ 45.3125 15.671875 45.3125 23.6875 \nL 45.3125 54.6875 \nL 54.296875 54.6875 \nL 54.296875 0 \nL 45.3125 0 \nL 45.3125 8.40625 \nQ 42.046875 3.421875 37.71875 1 \nQ 33.40625 -1.421875 27.6875 -1.421875 \nQ 18.265625 -1.421875 13.375 4.4375 \nQ 8.5 10.296875 8.5 21.578125 \nz\nM 31.109375 56 \nz\n\" id=\"DejaVuSans-117\"/>\n     <path d=\"M 41.109375 46.296875 \nQ 39.59375 47.171875 37.8125 47.578125 \nQ 36.03125 48 33.890625 48 \nQ 26.265625 48 22.1875 43.046875 \nQ 18.109375 38.09375 18.109375 28.8125 \nL 18.109375 0 \nL 9.078125 0 \nL 9.078125 54.6875 \nL 18.109375 54.6875 \nL 18.109375 46.1875 \nQ 20.953125 51.171875 25.484375 53.578125 \nQ 30.03125 56 36.53125 56 \nQ 37.453125 56 38.578125 55.875 \nQ 39.703125 55.765625 41.0625 55.515625 \nz\n\" id=\"DejaVuSans-114\"/>\n     <path d=\"M 52 44.1875 \nQ 55.375 50.25 60.0625 53.125 \nQ 64.75 56 71.09375 56 \nQ 79.640625 56 84.28125 50.015625 \nQ 88.921875 44.046875 88.921875 33.015625 \nL 88.921875 0 \nL 79.890625 0 \nL 79.890625 32.71875 \nQ 79.890625 40.578125 77.09375 44.375 \nQ 74.3125 48.1875 68.609375 48.1875 \nQ 61.625 48.1875 57.5625 43.546875 \nQ 53.515625 38.921875 53.515625 30.90625 \nL 53.515625 0 \nL 44.484375 0 \nL 44.484375 32.71875 \nQ 44.484375 40.625 41.703125 44.40625 \nQ 38.921875 48.1875 33.109375 48.1875 \nQ 26.21875 48.1875 22.15625 43.53125 \nQ 18.109375 38.875 18.109375 30.90625 \nL 18.109375 0 \nL 9.078125 0 \nL 9.078125 54.6875 \nL 18.109375 54.6875 \nL 18.109375 46.1875 \nQ 21.1875 51.21875 25.484375 53.609375 \nQ 29.78125 56 35.6875 56 \nQ 41.65625 56 45.828125 52.96875 \nQ 50 49.953125 52 44.1875 \nz\n\" id=\"DejaVuSans-109\"/>\n     <path d=\"M 54.890625 33.015625 \nL 54.890625 0 \nL 45.90625 0 \nL 45.90625 32.71875 \nQ 45.90625 40.484375 42.875 44.328125 \nQ 39.84375 48.1875 33.796875 48.1875 \nQ 26.515625 48.1875 22.3125 43.546875 \nQ 18.109375 38.921875 18.109375 30.90625 \nL 18.109375 0 \nL 9.078125 0 \nL 9.078125 54.6875 \nL 18.109375 54.6875 \nL 18.109375 46.1875 \nQ 21.34375 51.125 25.703125 53.5625 \nQ 30.078125 56 35.796875 56 \nQ 45.21875 56 50.046875 50.171875 \nQ 54.890625 44.34375 54.890625 33.015625 \nz\n\" id=\"DejaVuSans-110\"/>\n     <path d=\"M 18.3125 70.21875 \nL 18.3125 54.6875 \nL 36.8125 54.6875 \nL 36.8125 47.703125 \nL 18.3125 47.703125 \nL 18.3125 18.015625 \nQ 18.3125 11.328125 20.140625 9.421875 \nQ 21.96875 7.515625 27.59375 7.515625 \nL 36.8125 7.515625 \nL 36.8125 0 \nL 27.59375 0 \nQ 17.1875 0 13.234375 3.875 \nQ 9.28125 7.765625 9.28125 18.015625 \nL 9.28125 47.703125 \nL 2.6875 47.703125 \nL 2.6875 54.6875 \nL 9.28125 54.6875 \nL 9.28125 70.21875 \nz\n\" id=\"DejaVuSans-116\"/>\n    </defs>\n    <g transform=\"translate(156.37375 16.318125)scale(0.12 -0.12)\">\n     <use xlink:href=\"#DejaVuSans-77\"/>\n     <use x=\"86.279297\" xlink:href=\"#DejaVuSans-101\"/>\n     <use x=\"147.802734\" xlink:href=\"#DejaVuSans-97\"/>\n     <use x=\"209.082031\" xlink:href=\"#DejaVuSans-115\"/>\n     <use x=\"261.181641\" xlink:href=\"#DejaVuSans-117\"/>\n     <use x=\"324.560547\" xlink:href=\"#DejaVuSans-114\"/>\n     <use x=\"363.423828\" xlink:href=\"#DejaVuSans-101\"/>\n     <use x=\"424.947266\" xlink:href=\"#DejaVuSans-109\"/>\n     <use x=\"522.359375\" xlink:href=\"#DejaVuSans-101\"/>\n     <use x=\"583.882812\" xlink:href=\"#DejaVuSans-110\"/>\n     <use x=\"647.261719\" xlink:href=\"#DejaVuSans-116\"/>\n     <use x=\"686.470703\" xlink:href=\"#DejaVuSans-115\"/>\n    </g>\n   </g>\n  </g>\n  <g id=\"axes_2\">\n   <g id=\"patch_7\">\n    <path d=\"M 33.2875 239.758125 \nL 368.0875 239.758125 \nL 368.0875 140.921761 \nL 33.2875 140.921761 \nz\n\" style=\"fill:#ffffff;\"/>\n   </g>\n   <g id=\"matplotlib.axis_3\">\n    <g id=\"xtick_9\">\n     <g id=\"line2d_12\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"48.505682\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_4\">\n      <!-- 1000 -->\n      <g transform=\"translate(35.780682 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_10\">\n     <g id=\"line2d_13\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"89.359861\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_5\">\n      <!-- 1020 -->\n      <defs>\n       <path d=\"M 19.1875 8.296875 \nL 53.609375 8.296875 \nL 53.609375 0 \nL 7.328125 0 \nL 7.328125 8.296875 \nQ 12.9375 14.109375 22.625 23.890625 \nQ 32.328125 33.6875 34.8125 36.53125 \nQ 39.546875 41.84375 41.421875 45.53125 \nQ 43.3125 49.21875 43.3125 52.78125 \nQ 43.3125 58.59375 39.234375 62.25 \nQ 35.15625 65.921875 28.609375 65.921875 \nQ 23.96875 65.921875 18.8125 64.3125 \nQ 13.671875 62.703125 7.8125 59.421875 \nL 7.8125 69.390625 \nQ 13.765625 71.78125 18.9375 73 \nQ 24.125 74.21875 28.421875 74.21875 \nQ 39.75 74.21875 46.484375 68.546875 \nQ 53.21875 62.890625 53.21875 53.421875 \nQ 53.21875 48.921875 51.53125 44.890625 \nQ 49.859375 40.875 45.40625 35.40625 \nQ 44.1875 33.984375 37.640625 27.21875 \nQ 31.109375 20.453125 19.1875 8.296875 \nz\n\" id=\"DejaVuSans-50\"/>\n      </defs>\n      <g transform=\"translate(76.634861 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-50\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_11\">\n     <g id=\"line2d_14\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"130.214041\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_6\">\n      <!-- 1040 -->\n      <defs>\n       <path d=\"M 37.796875 64.3125 \nL 12.890625 25.390625 \nL 37.796875 25.390625 \nz\nM 35.203125 72.90625 \nL 47.609375 72.90625 \nL 47.609375 25.390625 \nL 58.015625 25.390625 \nL 58.015625 17.1875 \nL 47.609375 17.1875 \nL 47.609375 0 \nL 37.796875 0 \nL 37.796875 17.1875 \nL 4.890625 17.1875 \nL 4.890625 26.703125 \nz\n\" id=\"DejaVuSans-52\"/>\n      </defs>\n      <g transform=\"translate(117.489041 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-52\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_12\">\n     <g id=\"line2d_15\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"171.06822\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_7\">\n      <!-- 1060 -->\n      <defs>\n       <path d=\"M 33.015625 40.375 \nQ 26.375 40.375 22.484375 35.828125 \nQ 18.609375 31.296875 18.609375 23.390625 \nQ 18.609375 15.53125 22.484375 10.953125 \nQ 26.375 6.390625 33.015625 6.390625 \nQ 39.65625 6.390625 43.53125 10.953125 \nQ 47.40625 15.53125 47.40625 23.390625 \nQ 47.40625 31.296875 43.53125 35.828125 \nQ 39.65625 40.375 33.015625 40.375 \nz\nM 52.59375 71.296875 \nL 52.59375 62.3125 \nQ 48.875 64.0625 45.09375 64.984375 \nQ 41.3125 65.921875 37.59375 65.921875 \nQ 27.828125 65.921875 22.671875 59.328125 \nQ 17.53125 52.734375 16.796875 39.40625 \nQ 19.671875 43.65625 24.015625 45.921875 \nQ 28.375 48.1875 33.59375 48.1875 \nQ 44.578125 48.1875 50.953125 41.515625 \nQ 57.328125 34.859375 57.328125 23.390625 \nQ 57.328125 12.15625 50.6875 5.359375 \nQ 44.046875 -1.421875 33.015625 -1.421875 \nQ 20.359375 -1.421875 13.671875 8.265625 \nQ 6.984375 17.96875 6.984375 36.375 \nQ 6.984375 53.65625 15.1875 63.9375 \nQ 23.390625 74.21875 37.203125 74.21875 \nQ 40.921875 74.21875 44.703125 73.484375 \nQ 48.484375 72.75 52.59375 71.296875 \nz\n\" id=\"DejaVuSans-54\"/>\n      </defs>\n      <g transform=\"translate(158.34322 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-54\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_13\">\n     <g id=\"line2d_16\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"211.922399\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_8\">\n      <!-- 1080 -->\n      <defs>\n       <path d=\"M 31.78125 34.625 \nQ 24.75 34.625 20.71875 30.859375 \nQ 16.703125 27.09375 16.703125 20.515625 \nQ 16.703125 13.921875 20.71875 10.15625 \nQ 24.75 6.390625 31.78125 6.390625 \nQ 38.8125 6.390625 42.859375 10.171875 \nQ 46.921875 13.96875 46.921875 20.515625 \nQ 46.921875 27.09375 42.890625 30.859375 \nQ 38.875 34.625 31.78125 34.625 \nz\nM 21.921875 38.8125 \nQ 15.578125 40.375 12.03125 44.71875 \nQ 8.5 49.078125 8.5 55.328125 \nQ 8.5 64.0625 14.71875 69.140625 \nQ 20.953125 74.21875 31.78125 74.21875 \nQ 42.671875 74.21875 48.875 69.140625 \nQ 55.078125 64.0625 55.078125 55.328125 \nQ 55.078125 49.078125 51.53125 44.71875 \nQ 48 40.375 41.703125 38.8125 \nQ 48.828125 37.15625 52.796875 32.3125 \nQ 56.78125 27.484375 56.78125 20.515625 \nQ 56.78125 9.90625 50.3125 4.234375 \nQ 43.84375 -1.421875 31.78125 -1.421875 \nQ 19.734375 -1.421875 13.25 4.234375 \nQ 6.78125 9.90625 6.78125 20.515625 \nQ 6.78125 27.484375 10.78125 32.3125 \nQ 14.796875 37.15625 21.921875 38.8125 \nz\nM 18.3125 54.390625 \nQ 18.3125 48.734375 21.84375 45.5625 \nQ 25.390625 42.390625 31.78125 42.390625 \nQ 38.140625 42.390625 41.71875 45.5625 \nQ 45.3125 48.734375 45.3125 54.390625 \nQ 45.3125 60.0625 41.71875 63.234375 \nQ 38.140625 66.40625 31.78125 66.40625 \nQ 25.390625 66.40625 21.84375 63.234375 \nQ 18.3125 60.0625 18.3125 54.390625 \nz\n\" id=\"DejaVuSans-56\"/>\n      </defs>\n      <g transform=\"translate(199.197399 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-56\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_14\">\n     <g id=\"line2d_17\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"252.776579\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_9\">\n      <!-- 1100 -->\n      <g transform=\"translate(240.051579 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_15\">\n     <g id=\"line2d_18\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"293.630758\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_10\">\n      <!-- 1120 -->\n      <g transform=\"translate(280.905758 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-50\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_16\">\n     <g id=\"line2d_19\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"334.484937\" xlink:href=\"#m28dd5e3274\" y=\"239.758125\"/>\n      </g>\n     </g>\n     <g id=\"text_11\">\n      <!-- 1140 -->\n      <g transform=\"translate(321.759937 254.356562)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-52\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"matplotlib.axis_4\">\n    <g id=\"ytick_3\">\n     <g id=\"line2d_20\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"33.2875\" xlink:href=\"#mcc8a6dee28\" y=\"232.361141\"/>\n      </g>\n     </g>\n     <g id=\"text_12\">\n      <!-- 0.0 -->\n      <defs>\n       <path d=\"M 10.6875 12.40625 \nL 21 12.40625 \nL 21 0 \nL 10.6875 0 \nz\n\" id=\"DejaVuSans-46\"/>\n      </defs>\n      <g transform=\"translate(10.384375 236.160359)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_4\">\n     <g id=\"line2d_21\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"33.2875\" xlink:href=\"#mcc8a6dee28\" y=\"188.887732\"/>\n      </g>\n     </g>\n     <g id=\"text_13\">\n      <!-- 0.5 -->\n      <g transform=\"translate(10.384375 192.686951)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-53\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_5\">\n     <g id=\"line2d_22\">\n      <g>\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"33.2875\" xlink:href=\"#mcc8a6dee28\" y=\"145.414323\"/>\n      </g>\n     </g>\n     <g id=\"text_14\">\n      <!-- 1.0 -->\n      <g transform=\"translate(10.384375 149.213542)scale(0.1 -0.1)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"line2d_23\">\n    <path clip-path=\"url(#p6d2f6e88df)\" d=\"M 50.548391 232.303661 \nL 54.633809 232.240297 \nL 58.719227 231.924357 \nL 64.847354 231.077259 \nL 66.890063 230.629231 \nL 68.932772 230.321388 \nL 79.146316 227.928752 \nL 83.231734 226.25525 \nL 85.274443 225.727627 \nL 89.359861 223.896232 \nL 93.445279 221.214328 \nL 97.530697 218.752347 \nL 99.573406 217.239742 \nL 101.616115 215.982263 \nL 105.701533 213.01884 \nL 111.82966 206.8437 \nL 113.872369 205.015659 \nL 117.957787 200.792854 \nL 126.128623 189.209059 \nL 128.171332 185.891107 \nL 130.214041 183.392607 \nL 136.342167 171.472723 \nL 142.470294 157.734878 \nL 148.598421 148.061767 \nL 150.64113 145.414323 \nL 152.683839 151.618164 \nL 156.769257 163.036152 \nL 158.811966 169.879428 \nL 164.940093 185.78406 \nL 171.06822 200.265987 \nL 173.110929 204.361687 \nL 175.153638 208.81966 \nL 177.196347 212.718537 \nL 181.281765 219.864947 \nL 183.324474 222.669474 \nL 187.409892 227.689121 \nL 189.452601 229.783356 \nL 191.49531 231.292836 \nL 193.538019 232.477173 \nL 195.580728 233.791072 \nL 197.623437 234.578841 \nL 199.666146 235.104142 \nL 201.708854 235.265563 \nL 203.751563 235.170749 \nL 205.794272 234.81305 \nL 207.836981 234.175071 \nL 209.87969 233.179336 \nL 213.965108 230.323804 \nL 216.007817 228.079778 \nL 220.093235 223.039958 \nL 222.135944 220.281468 \nL 224.178653 217.160448 \nL 228.264071 210.329487 \nL 230.30678 206.630971 \nL 232.349489 202.679173 \nL 236.434907 194.520676 \nL 238.477616 190.478418 \nL 240.520325 186.016419 \nL 242.563034 180.231603 \nL 248.691161 164.547161 \nL 250.73387 158.39916 \nL 252.776579 152.879349 \nL 254.819288 157.216714 \nL 256.861997 161.898602 \nL 258.904706 165.786971 \nL 262.990124 172.201284 \nL 265.032833 173.676574 \nL 267.075541 176.906899 \nL 271.160959 183.919522 \nL 273.203668 186.793029 \nL 281.374504 197.060228 \nL 285.459922 200.933901 \nL 287.502631 203.373916 \nL 289.54534 204.922979 \nL 291.588049 206.732215 \nL 295.673467 210.65558 \nL 299.758885 213.765514 \nL 301.801594 215.622223 \nL 303.844303 216.685687 \nL 305.887012 218.60185 \nL 307.929721 220.321802 \nL 309.97243 221.511593 \nL 312.015139 222.447204 \nL 314.057848 223.749679 \nL 316.100557 224.730981 \nL 318.143266 225.511558 \nL 320.185975 226.44624 \nL 326.314102 228.45008 \nL 328.356811 228.96224 \nL 332.442228 230.253047 \nL 346.741191 232.119297 \nL 350.826609 232.327785 \nL 352.869318 232.325303 \nL 352.869318 232.325303 \n\" style=\"fill:none;stroke:#ff0000;stroke-linecap:square;stroke-width:1.5;\"/>\n   </g>\n   <g id=\"patch_8\">\n    <path d=\"M 33.2875 239.758125 \nL 33.2875 140.921761 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"patch_9\">\n    <path d=\"M 368.0875 239.758125 \nL 368.0875 140.921761 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"patch_10\">\n    <path d=\"M 33.2875 239.758125 \nL 368.0875 239.758125 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"patch_11\">\n    <path d=\"M 33.2875 140.921761 \nL 368.0875 140.921761 \n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n   </g>\n   <g id=\"text_15\">\n    <!-- Probabilities -->\n    <defs>\n     <path d=\"M 19.671875 64.796875 \nL 19.671875 37.40625 \nL 32.078125 37.40625 \nQ 38.96875 37.40625 42.71875 40.96875 \nQ 46.484375 44.53125 46.484375 51.125 \nQ 46.484375 57.671875 42.71875 61.234375 \nQ 38.96875 64.796875 32.078125 64.796875 \nz\nM 9.8125 72.90625 \nL 32.078125 72.90625 \nQ 44.34375 72.90625 50.609375 67.359375 \nQ 56.890625 61.8125 56.890625 51.125 \nQ 56.890625 40.328125 50.609375 34.8125 \nQ 44.34375 29.296875 32.078125 29.296875 \nL 19.671875 29.296875 \nL 19.671875 0 \nL 9.8125 0 \nz\n\" id=\"DejaVuSans-80\"/>\n     <path d=\"M 30.609375 48.390625 \nQ 23.390625 48.390625 19.1875 42.75 \nQ 14.984375 37.109375 14.984375 27.296875 \nQ 14.984375 17.484375 19.15625 11.84375 \nQ 23.34375 6.203125 30.609375 6.203125 \nQ 37.796875 6.203125 41.984375 11.859375 \nQ 46.1875 17.53125 46.1875 27.296875 \nQ 46.1875 37.015625 41.984375 42.703125 \nQ 37.796875 48.390625 30.609375 48.390625 \nz\nM 30.609375 56 \nQ 42.328125 56 49.015625 48.375 \nQ 55.71875 40.765625 55.71875 27.296875 \nQ 55.71875 13.875 49.015625 6.21875 \nQ 42.328125 -1.421875 30.609375 -1.421875 \nQ 18.84375 -1.421875 12.171875 6.21875 \nQ 5.515625 13.875 5.515625 27.296875 \nQ 5.515625 40.765625 12.171875 48.375 \nQ 18.84375 56 30.609375 56 \nz\n\" id=\"DejaVuSans-111\"/>\n     <path d=\"M 48.6875 27.296875 \nQ 48.6875 37.203125 44.609375 42.84375 \nQ 40.53125 48.484375 33.40625 48.484375 \nQ 26.265625 48.484375 22.1875 42.84375 \nQ 18.109375 37.203125 18.109375 27.296875 \nQ 18.109375 17.390625 22.1875 11.75 \nQ 26.265625 6.109375 33.40625 6.109375 \nQ 40.53125 6.109375 44.609375 11.75 \nQ 48.6875 17.390625 48.6875 27.296875 \nz\nM 18.109375 46.390625 \nQ 20.953125 51.265625 25.265625 53.625 \nQ 29.59375 56 35.59375 56 \nQ 45.5625 56 51.78125 48.09375 \nQ 58.015625 40.1875 58.015625 27.296875 \nQ 58.015625 14.40625 51.78125 6.484375 \nQ 45.5625 -1.421875 35.59375 -1.421875 \nQ 29.59375 -1.421875 25.265625 0.953125 \nQ 20.953125 3.328125 18.109375 8.203125 \nL 18.109375 0 \nL 9.078125 0 \nL 9.078125 75.984375 \nL 18.109375 75.984375 \nz\n\" id=\"DejaVuSans-98\"/>\n     <path d=\"M 9.421875 54.6875 \nL 18.40625 54.6875 \nL 18.40625 0 \nL 9.421875 0 \nz\nM 9.421875 75.984375 \nL 18.40625 75.984375 \nL 18.40625 64.59375 \nL 9.421875 64.59375 \nz\n\" id=\"DejaVuSans-105\"/>\n     <path d=\"M 9.421875 75.984375 \nL 18.40625 75.984375 \nL 18.40625 0 \nL 9.421875 0 \nz\n\" id=\"DejaVuSans-108\"/>\n    </defs>\n    <g transform=\"translate(164.039688 134.921761)scale(0.12 -0.12)\">\n     <use xlink:href=\"#DejaVuSans-80\"/>\n     <use x=\"58.552734\" xlink:href=\"#DejaVuSans-114\"/>\n     <use x=\"97.416016\" xlink:href=\"#DejaVuSans-111\"/>\n     <use x=\"158.597656\" xlink:href=\"#DejaVuSans-98\"/>\n     <use x=\"222.074219\" xlink:href=\"#DejaVuSans-97\"/>\n     <use x=\"283.353516\" xlink:href=\"#DejaVuSans-98\"/>\n     <use x=\"346.830078\" xlink:href=\"#DejaVuSans-105\"/>\n     <use x=\"374.613281\" xlink:href=\"#DejaVuSans-108\"/>\n     <use x=\"402.396484\" xlink:href=\"#DejaVuSans-105\"/>\n     <use x=\"430.179688\" xlink:href=\"#DejaVuSans-116\"/>\n     <use x=\"469.388672\" xlink:href=\"#DejaVuSans-105\"/>\n     <use x=\"497.171875\" xlink:href=\"#DejaVuSans-101\"/>\n     <use x=\"558.695312\" xlink:href=\"#DejaVuSans-115\"/>\n    </g>\n   </g>\n  </g>\n </g>\n <defs>\n  <clipPath id=\"p6040823aec\">\n   <rect height=\"98.836364\" width=\"334.8\" x=\"33.2875\" y=\"22.318125\"/>\n  </clipPath>\n  <clipPath id=\"p6d2f6e88df\">\n   <rect height=\"98.836364\" width=\"334.8\" x=\"33.2875\" y=\"140.921761\"/>\n  </clipPath>\n </defs>\n</svg>\n"
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ],
   "source": [
    "fig, axes = plt.subplots(2, 1, sharex=True)\n",
    "frame['measurement'].plot.line(ax=axes[0], title='Measurements')\n",
    "frame['probability'].plot.line(ax=axes[1], title='Probabilities',color='r')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we can see in the charts above, we can now see how the estimator works for finding where change points could be based on how the particular point partitions the space. While that's interesting, we still need to check which/whether these high-probability change points partition the space nicely (or in a statistically significant way).\n",
    "\n",
    "This is where the Mann-Whitney U-Test and Kolmogorov-Smirnov tests can help us with determining the likelihood that these are actually points that clearly partition the measurements. We'll use the `ChangePointEstimator` function to give us a most-likely index for the dataset we've provided."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "18.4 s ± 356 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n[46, 50, 100]\n"
    }
   ],
   "source": [
    "# We need to convert the measurements into a Python list\n",
    "# because the pure Python implementation can only work with\n",
    "# those native objects.\n",
    "inputs = list(measurements)\n",
    "result = ccd.ClusterAndFindSplit(inputs)\n",
    "\n",
    "# WARNING: Running this might take a while depending on how\n",
    "# capable your machine is.\n",
    "%timeit ccd.ClusterAndFindSplit(inputs)\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Alternative A: Vectorized Implementation\n",
    "The shortcoming for the above implementation, is that it's using a non-vectorized core performing permutation testing on sub-sets. In this section we're going to explore an alternative implementation which uses more facilities in `pandas` to help us generate the permutation space in a vectorized manner, as well as vectorize our computation of the estimator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# TODO(dberris): Implement the purely vectorized versions here."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Alternative B: Using GPUs\n",
    "While it's fine to be using just the SIMD instructions with `numba`, if we're dealing with a lot of data (in the order of tens of thousands of points) we might actually benefit from using GPUs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# TODO(dberris): Implement a GPU-accelerated versions here."
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "3.7.7-final"
  },
  "orig_nbformat": 2,
  "kernelspec": {
   "name": "python37764bitdb14b7a5354e404fa1f30dad2c5e1480",
   "display_name": "Python 3.7.7 64-bit"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}